package com.pescamillam.kiosco.sql;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.pescamillam.kiosco.main.Main;

public class SqlConnection {

	// caracol
//	private static final String url = "jdbc:sqlserver://172.17.86.99";
//	private static final String className = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
//	private static final String user = "java";
//	private static final String password = "999";

	// Portatil
	 private static final String url =
	 "jdbc:sqlserver://localhost\\SQLEXPRESS";
	 private static final String className =
	 "com.microsoft.sqlserver.jdbc.SQLServerDriver";
	 private static final String user = "javauser";
	 private static final String password = "999";

	private static String insertStatement;
	private static String selectStatement;
	private static String selectStatementUsuario;
	private static String updateStatmentTicket;
	
	static {
		if (Main.test) {
			insertStatement = "insert into codigos (cedula_usuario, nombre_usuario, codigo, dispositivo, marca, image, ticketEnable, serial, inserted_date) values (?,?,?,?,?,?,?,?,getdate())";
			selectStatement = "select cedula_usuario, nombre_usuario, codigo, dispositivo, marca, image, ticketEnable, serial from codigos where codigo = ? order by id desc";
			selectStatementUsuario = "select nombre, apellidos from tvisitantes_huella where documento = ?";
			updateStatmentTicket = "update codigos SET ticketEnable=null where codigo = ?;";
		} else {
			insertStatement = "insert into [A1ABIOIDTAC].[dbo].codigos (cedula_usuario, nombre_usuario, codigo, dispositivo, marca, image, ticketEnable, serial, inserted_date) values (?,?,?,?,?,?,?,?,getdate())";
			selectStatement = "select cedula_usuario, nombre_usuario, codigo, dispositivo, marca, image, ticketEnable, serial  from [A1ABIOIDTAC].[dbo].codigos where codigo = ? order by id desc";
			selectStatementUsuario = "select nombre, apellidos from [A1ABIOIDTAC].[dbo].tvisitantes_huella where documento = ?";
			updateStatmentTicket = "update [A1ABIOIDTAC].[dbo].codigos SET ticketEnable=null where codigo = ?;";
		}
	}
	
	public static boolean insertarCodigo(String cedulaUsuario,
			String nombreUsuario, String codigo, String dispositivo,
			String marca, InputStream image, String ticketEnable, String serial) {
		Connection con = null;
		PreparedStatement st = null;
		try {
			Class.forName(className);
			con = DriverManager.getConnection(url, user, password);
			st = con.prepareStatement(insertStatement);
			st.setString(1, cedulaUsuario);
			st.setString(2, nombreUsuario);
			st.setString(3, codigo);
			st.setString(4, dispositivo);
			st.setString(5, marca);
			st.setBinaryStream(6, image);
			st.setString(7, ticketEnable);
			st.setString(8, serial);
			st.execute();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (con != null) {
					con.close();
				}
				if (st != null) {
					st.close();
				}
			} catch (Exception e2) {
				// it's ok
			}
		}
		return false;
	}

	public static Code consultarCodigo(String codigo) {
		try {
			List<Code> codigos = new ArrayList<Code>();
			Class.forName(className);
			Connection con = DriverManager.getConnection(url, user, password);
			PreparedStatement st = con
					.prepareStatement(selectStatement);
			st.setString(1, codigo);
			ResultSet resultado = st.executeQuery();

			while (resultado.next()) {
				Code consulta = new Code();
				consulta.cedulaUsuario = resultado.getString(1);
				consulta.nombreUsuario = resultado.getString(2);
				consulta.codigo = resultado.getString(3);
				consulta.dispositivo = resultado.getString(4);
				consulta.marca = resultado.getString(5);
				consulta.imagen = new ByteArrayInputStream(
						resultado.getBytes(6));
				consulta.ticketEnable = resultado.getString(7);
				consulta.serial = resultado.getString(8);
				codigos.add(consulta);
			}
			st.close();
			con.close();
			if (codigos.size() > 0) {
				return codigos.get(0);
			}
			return null;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;

	}
	
	@SuppressWarnings("resource")
	public static String consultarNombre(String documento) {
		Connection con = null;
		PreparedStatement st = null;
		ResultSet resultado = null;
		try {
			List<String> nombres = new ArrayList<String>();
			Class.forName(className);
			con = DriverManager.getConnection(url, user, password);
			st = con.prepareStatement(selectStatement);
			st.setString(1, documento);
			resultado = st.executeQuery();

			while (resultado.next()) {
				String nombre = resultado.getString(1) + " "
						+ resultado.getString(2);
				nombres.add(nombre);
				return nombre;
			}
			st.close();
			st = con.prepareStatement(selectStatementUsuario);
			st.setString(1, documento);

			resultado = st.executeQuery();

			while (resultado.next()) {
				String nombre = resultado.getString(1) + " "
						+ resultado.getString(2);
				nombres.add(nombre);
				return nombre;
			}
			st.close();
			con.close();
			if (nombres.size() > 0) {
				return nombres.get(0);
			}
			return null;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				resultado.close();
				st.close();
				con.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return null;
	}

	public static void cambiarTicketEnable(String codigo) {
		
		try {
			Class.forName(className);
			Connection con = DriverManager.getConnection(url, user, password);
			PreparedStatement st = con
					.prepareStatement(updateStatmentTicket);
			st.setString(1, codigo);
			st.execute();
			System.out.println(updateStatmentTicket);
			System.out.println(codigo);
			st.close();
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	
	public static void createTable() {
		try {
			String createTableQuery = "create table codigos (\r\n"
					+ "   id int IDENTITY(1,1), \r\n"
					+ "	cedula_usuario nvarchar(30), \r\n"
					+ "	nombre_usuario nvarchar(30), \r\n"
					+ "	codigo nvarchar(30), \r\n"
					+ "	dispositivo nvarchar(30), \r\n"
					+ "	marca nvarchar(20), \r\n" + "	image varBinary\r\n"
					+ ")";
			Class.forName(className);
			Connection con = DriverManager.getConnection(url, user, password);
			Statement st = con.createStatement();
			st.execute(createTableQuery);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void addSerialColumn() {
		try {
			String createTableQuery = "alter table codigos add ticketEnable serial nvarchar(40), nvarchar(40), inserted_date datetime";
			Class.forName(className);
			Connection con = DriverManager.getConnection(url, user, password);
			Statement st = con.createStatement();
			st.execute(createTableQuery);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		addSerialColumn();
	}

}
